package com.softtown.modules.sys.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.softtown.common.constant.Constant;
import com.softtown.common.enums.IsDeleteEnum;
import com.softtown.common.enums.SystemModelEnum;
import com.softtown.common.exception.ErrorCode;
import com.softtown.common.service.impl.BaseServiceImpl;
import com.softtown.common.utils.ConvertUtils;
import com.softtown.common.utils.Result;
import com.softtown.license.license.CustomLicenseManager;
import com.softtown.modules.organization.vo.CompOrgEmplNameVO;
import com.softtown.modules.oss.cloud.OSSFactory;
import com.softtown.modules.security.password.PasswordUtils;
import com.softtown.modules.security.user.SecurityUser;
import com.softtown.modules.sys.dao.CompSysUserEmplDao;
import com.softtown.modules.sys.dto.CompSysUserEmplInfoDTO;
import com.softtown.modules.sys.dto.CompSysUserEmplPageDTO;
import com.softtown.modules.sys.dto.SysUserDTO;
import com.softtown.modules.sys.entity.*;
import com.softtown.modules.sys.enums.StatusEnum;
import com.softtown.modules.sys.service.CompSysHstUserEmplService;
import com.softtown.modules.sys.service.CompSysRoleUserService;
import com.softtown.modules.sys.service.CompSysUserEmplService;
import com.softtown.modules.sys.service.SysCompService;
import com.softtown.modules.sys.service.SysUserService;
import com.softtown.modules.sys.vo.CompSysUserEmplBasicsVO;
import java.util.Map;
import java.util.Objects;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

/**
 * @author: Dingyayong
 * @Date: 2019/6/4 10:04
 * @Description:
 */
@Service
public class CompSysUserEmplServiceImpl extends BaseServiceImpl<CompSysUserEmplDao, CompSysUserEmplEntity> implements CompSysUserEmplService {

    @Resource
    private CompSysRoleUserService compSysRoleUserService;

    @Resource
    private SysUserService sysUserService;

    @Resource
    private SysCompService sysCompService;

    @Resource
    private CompSysHstUserEmplService compSysHstUserEmplService;

    @Override
    public List<CompSysUserEmplEntity> findAllCompEmpl(Long compId) {
        return baseDao.findAllCompEmpl(compId);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public Result activate(Long compId, Long userId) {
        Map<String, Object> codeMap = CustomLicenseManager.codeMap;
        Result result = new Result<>();
        CompSysUserEmplEntity compSysUserEmplEntity = baseDao.findByCompIdAndUserId(compId, userId);
        if (compSysUserEmplEntity.getStatus().equals(StatusEnum.FORBIDDENSTATUS.value())) {
            // 判断如果系统模式为saas时
            if (Constant.SYSTEM_MODEL.equals(SystemModelEnum.MODEL_SAAS.value())) {
                SysCompEntity sysCompEntity = sysCompService.getCompanyById(compId);
                if (baseDao.getActiveUser(compId) >= sysCompEntity.getActivatableUsers()) {
                    return result.error(ErrorCode.ACTIVE_USER_NUM);
                } else {
                    compSysUserEmplEntity.setStatus(StatusEnum.ACTIVATESTATUS.value());
                }
            }
            // 判断如果系统模式为op时
            if(Constant.SYSTEM_MODEL.equals(SystemModelEnum.MODEL_OP.value())){
                // op模式下 所有正常状态下的用户总数
                int allUser = baseDao.getAllUserCount();
                if(allUser >= Integer.parseInt(codeMap.get("consumerAmount").toString())){
                    return result.error(ErrorCode.ACTIVE_USER_NUM);
                }else {
                    compSysUserEmplEntity.setStatus(StatusEnum.ACTIVATESTATUS.value());
                }
            }
        } else {
            compSysUserEmplEntity.setStatus(StatusEnum.FORBIDDENSTATUS.value());
        }
        updateById(compSysUserEmplEntity);
        return result;
    }

    @Override
    public CompSysUserEmplEntity findCompEmpl(Long compId, Long userId) {
        return baseDao.findByCompIdAndUserId(compId, userId);
    }

    @Override
    public CompSysUserEmplEntity findEmpl(Long compId, Long emplId) {
        return baseDao.findByCompIdAndEmplId(compId, emplId);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateUserEmpl(CompSysUserEmplEntity compSysUserEmplEntity) {
         baseDao.updateUserEmpl(compSysUserEmplEntity);
    }

    @Override
    public PageInfo<CompSysUserEmplEntity> findUserPage(CompSysUserEmplPageDTO compSysUserEmplPageDTO) {
        Page page = PageHelper.startPage(compSysUserEmplPageDTO.getPage(), compSysUserEmplPageDTO.getPageSize());
        List<CompSysUserEmplEntity> compSysUserEmplEntities = baseDao.findUserPage(compSysUserEmplPageDTO.getCompId(), compSysUserEmplPageDTO.getParam());
        for (CompSysUserEmplEntity compSysUserEmplEntity : compSysUserEmplEntities) {
            if (compSysUserEmplEntity.getHeadUrl() != null) {
                compSysUserEmplEntity.setHeadUrl(Objects.requireNonNull(OSSFactory.build()).getHeadUrl(compSysUserEmplEntity.getHeadUrl()));
            }
        }
        return ConvertUtils.pageInfoToTarget(page, compSysUserEmplEntities);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateEmplInfo(SysUserDTO sysUserDTO) {
        List<Long> roleList = compSysRoleUserService.getRoleIdList(sysUserDTO.getCompId(), sysUserDTO.getId());
        for (Long role : roleList) {
            CompSysRoleUserEntity compSysRoleUserEntity1 = compSysRoleUserService.getRoleUserEntity(sysUserDTO.getCompId(), role, sysUserDTO.getId());
            compSysRoleUserEntity1.setUpdateDate(new Date());
            compSysRoleUserEntity1.setUpdateTimestamp(String.valueOf(System.currentTimeMillis()));
            compSysRoleUserEntity1.setIsDeleted(null);
            compSysRoleUserService.updateRoleUserInfo(compSysRoleUserEntity1);
        }
        for (Long roldId : sysUserDTO.getRoleIdList()) {
            CompSysRoleUserEntity compSysRoleUserEntity =
                    compSysRoleUserService.getRoleUserEntity(sysUserDTO.getCompId(), roldId, sysUserDTO.getId());
            if (compSysRoleUserEntity == null) {
                CompSysRoleUserEntity compSysRoleUserEntity1
                        = new CompSysRoleUserEntity();
                compSysRoleUserEntity1.setCompId(sysUserDTO.getCompId());
                compSysRoleUserEntity1.setRoleId(roldId);
                compSysRoleUserEntity1.setUserId(sysUserDTO.getId());
                compSysRoleUserEntity1.setUpdateTimestamp(String.valueOf(System.currentTimeMillis()));
                compSysRoleUserEntity1.setIsDeleted(IsDeleteEnum.NORMAL.value());
                compSysRoleUserEntity1.setUpdater(SecurityUser.getUserId());
                compSysRoleUserService.insert(compSysRoleUserEntity1);
            } else {
                compSysRoleUserEntity.setUpdateDate(new Date());
                compSysRoleUserEntity.setUpdateTimestamp(String.valueOf(System.currentTimeMillis()));
                compSysRoleUserService.updateRoleUserInfo(compSysRoleUserEntity);
            }
        }
        CompSysUserEmplEntity compSysUserEmplEntity = baseDao.findByCompIdAndUserId(sysUserDTO.getCompId(), sysUserDTO.getId());
        if (compSysUserEmplEntity != null) {
            if (compSysUserEmplEntity.getEmplId() != null) {
                if(sysUserDTO.getEmplId() != null){
                    if (compSysUserEmplEntity.getEmplId().equals(sysUserDTO.getEmplId())) {
                        compSysUserEmplEntity.setIsDeleted(IsDeleteEnum.NORMAL.value());
                        compSysUserEmplEntity.setUpdateDate(new Date());
                        compSysUserEmplEntity.setUpdateTimestamp(String.valueOf(System.currentTimeMillis()));
                    } else {
                        CompSysUserEmplEntity compSysUserEmplEntityByEmpl =
                            baseDao.findByCompIdAndEmplId(sysUserDTO.getCompId(), sysUserDTO.getEmplId());
                        if(compSysUserEmplEntityByEmpl != null){
                            compSysUserEmplEntityByEmpl.setEmplId(null);
                            baseDao.updateUserEmpl(compSysUserEmplEntityByEmpl);
                        }
                        CompSysHstUserEmplEntity compSysHstUserEmplEntity =new CompSysHstUserEmplEntity();
                        compSysHstUserEmplEntity.setCompId(sysUserDTO.getCompId());
                        compSysHstUserEmplEntity.setExprDate(new Date());
                        compSysHstUserEmplEntity.setUpdateTimestamp(String.valueOf(System.currentTimeMillis()));
                        compSysHstUserEmplEntity.setEmplIdNew(sysUserDTO.getEmplId());
                        compSysHstUserEmplEntity.setEmplIdOld(compSysUserEmplEntity.getEmplId());
                        compSysHstUserEmplEntity.setUserId(sysUserDTO.getId());
                        compSysUserEmplEntity.setEmplId(sysUserDTO.getEmplId());
                        compSysUserEmplEntity.setIsDeleted(IsDeleteEnum.NORMAL.value());
                        compSysUserEmplEntity.setUpdateDate(new Date());
                        compSysUserEmplEntity.setUpdateTimestamp(String.valueOf(System.currentTimeMillis()));
                        compSysHstUserEmplService.insert(compSysHstUserEmplEntity);
                    }
                }else {
                    CompSysHstUserEmplEntity compSysHstUserEmplEntity =new CompSysHstUserEmplEntity();
                    compSysHstUserEmplEntity.setCompId(sysUserDTO.getCompId());
                    compSysHstUserEmplEntity.setExprDate(new Date());
                    compSysHstUserEmplEntity.setUpdateTimestamp(String.valueOf(System.currentTimeMillis()));
                    compSysHstUserEmplEntity.setEmplIdOld(compSysUserEmplEntity.getEmplId());
                    compSysHstUserEmplEntity.setUserId(sysUserDTO.getId());
                    compSysHstUserEmplService.insert(compSysHstUserEmplEntity);
                    compSysUserEmplEntity.setEmplId(null);
                    compSysUserEmplEntity.setIsDeleted(IsDeleteEnum.NORMAL.value());
                    compSysUserEmplEntity.setUpdateDate(new Date());
                    compSysUserEmplEntity.setUpdateTimestamp(String.valueOf(System.currentTimeMillis()));
                }
            } else {
                if(sysUserDTO.getEmplId() != null){
                    CompSysHstUserEmplEntity compSysHstUserEmplEntity =new CompSysHstUserEmplEntity();
                    compSysHstUserEmplEntity.setCompId(sysUserDTO.getCompId());
                    compSysHstUserEmplEntity.setExprDate(new Date());
                    compSysHstUserEmplEntity.setUpdateTimestamp(String.valueOf(System.currentTimeMillis()));
                    compSysHstUserEmplEntity.setEmplIdNew(sysUserDTO.getEmplId());
                    compSysHstUserEmplEntity.setUserId(sysUserDTO.getId());
                    compSysHstUserEmplService.insert(compSysHstUserEmplEntity);
                    CompSysUserEmplEntity compSysUserEmplEntityByEmpl =
                        baseDao.findByCompIdAndEmplId(sysUserDTO.getCompId(), sysUserDTO.getEmplId());
                    if(compSysUserEmplEntityByEmpl != null){
                        compSysUserEmplEntityByEmpl.setEmplId(null);
                        baseDao.updateUserEmpl(compSysUserEmplEntityByEmpl);
                    }
                    compSysUserEmplEntity.setEmplId(sysUserDTO.getEmplId());
                }
                compSysUserEmplEntity.setIsDeleted(IsDeleteEnum.NORMAL.value());
                compSysUserEmplEntity.setUpdateDate(new Date());
                compSysUserEmplEntity.setUpdateTimestamp(String.valueOf(System.currentTimeMillis()));

            }
        }
        baseDao.updateUserEmpl(compSysUserEmplEntity);
    }

    /**
     * 根据公司id和UsuerID获取员工基本信息
     *
     * @param compSysUserEmplInfoDTO
     * @return CompSysUserEmplBasicsVO
     */
    @Override
    public Result<CompSysUserEmplBasicsVO> getCompUserEmplBasics(CompSysUserEmplInfoDTO compSysUserEmplInfoDTO) {
        CompSysUserEmplBasicsEntity compSysUserEmplBasicsEntity = baseDao.selectUserIdInfo(compSysUserEmplInfoDTO.getCompId(), compSysUserEmplInfoDTO.getUserId());
        if (compSysUserEmplInfoDTO.getUserId() == null) {
            return new Result().error(ErrorCode.UNRELATED_EMPLOYEES_ERROR);
        }
        return new Result<CompSysUserEmplBasicsVO>().ok(ConvertUtils.sourceToTarget(compSysUserEmplBasicsEntity, CompSysUserEmplBasicsVO.class));
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void addEmplInfo(SysUserDTO sysUserDTO) {
        Map<String, Object> codeMap = CustomLicenseManager.codeMap;
        SysUserEntity sysUserEntity = new SysUserEntity();
        sysUserEntity.setStatus(StatusEnum.ACTIVATESTATUS.value());
        sysUserEntity.setUsername(sysUserDTO.getUsername());
        sysUserEntity.setMobile(sysUserDTO.getMobile());
        sysUserEntity.setEmail(sysUserDTO.getEmail());
        if(sysUserDTO.getHeadUrl() != null){
            if(sysUserDTO.getHeadUrl().length() >0){
                sysUserEntity.setHeadUrl(sysUserDTO.getHeadUrl());
            }else {
                sysUserEntity.setHeadUrl(null);
            }

        }else {
            sysUserEntity.setHeadUrl(null);
        }
        sysUserEntity.setDfltCompId(sysUserDTO.getCompId());
        sysUserEntity.setIsInitPassword(1);
        sysUserEntity.setLanguage(sysUserDTO.getLanguage());
        sysUserEntity.setNickname(sysUserDTO.getNickname());
        sysUserEntity.setUpdateTimestamp(String.valueOf(System.currentTimeMillis()));
        sysUserEntity.setPassword(PasswordUtils.encode(sysUserDTO.getPassword()));
        sysUserService.insert(sysUserEntity);
        SysUserEntity sysUserEntity1 = sysUserService.getEntityByMobile(sysUserDTO.getMobile());
        SysCompEntity sysCompEntity = sysCompService.getCompanyById(sysUserDTO.getCompId());

        if(sysUserDTO.getEmplId() != null){
            CompSysUserEmplEntity compSysUserEmplEntitys = baseDao.findByCompIdAndEmplId(sysUserDTO.getCompId(), sysUserDTO.getEmplId());
            if (compSysUserEmplEntitys != null){
                if(compSysUserEmplEntitys.getUserId() !=null){
                    if(!sysUserEntity1.getId().equals(compSysUserEmplEntitys.getUserId())){
                        CompSysHstUserEmplEntity compSysHstUserEmplEntity =new CompSysHstUserEmplEntity();
                        compSysHstUserEmplEntity.setCompId(sysUserDTO.getCompId());
                        compSysHstUserEmplEntity.setExprDate(new Date());
                        compSysHstUserEmplEntity.setUpdateTimestamp(String.valueOf(System.currentTimeMillis()));
                        compSysHstUserEmplEntity.setEmplIdOld(sysUserDTO.getEmplId());
                        compSysHstUserEmplEntity.setUserId(compSysUserEmplEntitys.getUserId());
                        compSysHstUserEmplService.insert(compSysHstUserEmplEntity);
                        compSysUserEmplEntitys.setEmplId(null);
                        compSysUserEmplEntitys.setIsDeleted(IsDeleteEnum.NORMAL.value());
                        compSysUserEmplEntitys.setUpdateDate(new Date());
                        compSysUserEmplEntitys.setUpdateTimestamp(String.valueOf(System.currentTimeMillis()));
                        baseDao.updateUserEmpl(compSysUserEmplEntitys);
                        CompSysUserEmplEntity compSysUserEmplEntity = new CompSysUserEmplEntity();
                        compSysUserEmplEntity.setCompId(sysUserDTO.getCompId());
                        compSysUserEmplEntity.setEmplId(sysUserDTO.getEmplId());
                        compSysUserEmplEntity.setUserId(sysUserEntity1.getId());
                        // 判断如果系统模式为saas时
                        if (Constant.SYSTEM_MODEL.equals(SystemModelEnum.MODEL_SAAS.value())) {
                            if (baseDao.getActiveUser(sysUserDTO.getCompId()) >= sysCompEntity
                                    .getActivatableUsers()) {
                                compSysUserEmplEntity.setStatus(StatusEnum.FORBIDDENSTATUS.value());
                            } else {
                                compSysUserEmplEntity.setStatus(StatusEnum.ACTIVATESTATUS.value());
                            }
                        }
                        // 判断如果系统模式为op模式时
                        else if (Constant.SYSTEM_MODEL.equals(SystemModelEnum.MODEL_OP.value())){
                            int allUser = baseDao.getAllUserCount();
                            if(allUser >= Integer.parseInt(codeMap.get("consumerAmount").toString())){
                                compSysUserEmplEntity.setStatus(StatusEnum.FORBIDDENSTATUS.value());
                            }else {
                                compSysUserEmplEntity.setStatus(StatusEnum.ACTIVATESTATUS.value());
                            }
                        }
                        baseDao.insert(compSysUserEmplEntity);
                        CompSysHstUserEmplEntity compSysHstUserEmplEntity1 =
                            new CompSysHstUserEmplEntity();
                        compSysHstUserEmplEntity1.setCompId(sysUserDTO.getCompId());
                        compSysHstUserEmplEntity1.setExprDate(new Date());
                        compSysHstUserEmplEntity1.setUpdateTimestamp(String.valueOf(System.currentTimeMillis()));
                        compSysHstUserEmplEntity1.setEmplIdNew(sysUserDTO.getEmplId());
                        compSysHstUserEmplEntity1.setUserId(sysUserEntity1.getId());
                        compSysHstUserEmplService.insert(compSysHstUserEmplEntity1);
                    }
                }else {
                    CompSysHstUserEmplEntity compSysHstUserEmplEntity =new CompSysHstUserEmplEntity();
                    compSysHstUserEmplEntity.setCompId(sysUserDTO.getCompId());
                    compSysHstUserEmplEntity.setExprDate(new Date());
                    compSysHstUserEmplEntity.setUpdateTimestamp(String.valueOf(System.currentTimeMillis()));
                    compSysHstUserEmplEntity.setEmplIdNew(sysUserDTO.getEmplId());
                    compSysHstUserEmplEntity.setUserId(sysUserEntity1.getId());
                    compSysHstUserEmplService.insert(compSysHstUserEmplEntity);
                    compSysUserEmplEntitys.setUserId(sysUserEntity1.getId());
                    compSysUserEmplEntitys.setIsDeleted(IsDeleteEnum.NORMAL.value());
                    compSysUserEmplEntitys.setUpdateDate(new Date());
                    compSysUserEmplEntitys.setUpdateTimestamp(String.valueOf(System.currentTimeMillis()));
                    baseDao.updateUserEmpl(compSysUserEmplEntitys);
                }
            } else {
                CompSysUserEmplEntity compSysUserEmplEntity = new CompSysUserEmplEntity();
                compSysUserEmplEntity.setCompId(sysUserDTO.getCompId());
                compSysUserEmplEntity.setEmplId(sysUserDTO.getEmplId());
                compSysUserEmplEntity.setUserId(sysUserEntity1.getId());
                compSysUserEmplEntity.setUpdateTimestamp(String.valueOf(System.currentTimeMillis()));
                if (Constant.SYSTEM_MODEL.equals(SystemModelEnum.MODEL_SAAS.value())) {
                    if (baseDao.getActiveUser(sysUserDTO.getCompId()) >= sysCompEntity.getActivatableUsers()) {
                        compSysUserEmplEntity.setStatus(StatusEnum.FORBIDDENSTATUS.value());
                    } else {
                        compSysUserEmplEntity.setStatus(StatusEnum.ACTIVATESTATUS.value());
                    }
                }else if (Constant.SYSTEM_MODEL.equals(SystemModelEnum.MODEL_OP.value())) {
                    // op模式下 所有正常状态下的用户总数
                    int allUser = baseDao.getAllUserCount();
                    if(allUser >= Integer.parseInt(codeMap.get("consumerAmount").toString())){
                        compSysUserEmplEntity.setStatus(StatusEnum.FORBIDDENSTATUS.value());
                    }else {
                        compSysUserEmplEntity.setStatus(StatusEnum.ACTIVATESTATUS.value());
                    }
                }
                baseDao.insert(compSysUserEmplEntity);
                CompSysHstUserEmplEntity compSysHstUserEmplEntity =new CompSysHstUserEmplEntity();
                compSysHstUserEmplEntity.setCompId(sysUserDTO.getCompId());
                compSysHstUserEmplEntity.setExprDate(new Date());
                compSysHstUserEmplEntity.setUpdateTimestamp(String.valueOf(System.currentTimeMillis()));
                compSysHstUserEmplEntity.setEmplIdNew(sysUserDTO.getEmplId());
                compSysHstUserEmplEntity.setUserId(sysUserEntity1.getId());
                compSysHstUserEmplService.insert(compSysHstUserEmplEntity);
            }
        } else {
            CompSysUserEmplEntity compSysUserEmplEntity = new CompSysUserEmplEntity();
            compSysUserEmplEntity.setCompId(sysUserDTO.getCompId());
            compSysUserEmplEntity.setUserId(sysUserEntity1.getId());
            compSysUserEmplEntity.setUpdateTimestamp(String.valueOf(System.currentTimeMillis()));
            if (Constant.SYSTEM_MODEL.equals(SystemModelEnum.MODEL_SAAS.value())) {
                if (baseDao.getActiveUser(sysUserDTO.getCompId()) >= sysCompEntity.getActivatableUsers()) {
                    compSysUserEmplEntity.setStatus(StatusEnum.FORBIDDENSTATUS.value());
                } else {
                    compSysUserEmplEntity.setStatus(StatusEnum.ACTIVATESTATUS.value());
                }
            }else if (Constant.SYSTEM_MODEL.equals(SystemModelEnum.MODEL_OP.value())) {
                // op模式下 所有正常状态下的用户总数
                int allUser = baseDao.getAllUserCount();
                if(allUser >= Integer.parseInt(codeMap.get("consumerAmount").toString())){
                    compSysUserEmplEntity.setStatus(StatusEnum.FORBIDDENSTATUS.value());
                }else {
                    compSysUserEmplEntity.setStatus(StatusEnum.ACTIVATESTATUS.value());
                }
            }

            baseDao.insert(compSysUserEmplEntity);
        }
        for (Long roleId : sysUserDTO.getRoleIdList()) {
            CompSysRoleUserEntity compSysRoleUserEntity = new CompSysRoleUserEntity();
            compSysRoleUserEntity.setUserId(sysUserEntity1.getId());
            compSysRoleUserEntity.setRoleId(roleId);
            compSysRoleUserEntity.setCompId(sysUserDTO.getCompId());
            compSysRoleUserEntity.setUpdateTimestamp(String.valueOf(System.currentTimeMillis()));
            compSysRoleUserService.insert(compSysRoleUserEntity);
        }
    }

    /**
     * 通过公司id和用户id查出员工姓名
     *
     * @param compId
     * @param userId
     * @return java.lang.String
     * @author fuming
     * @date 2019/11/8 14:39
     */
    @Override
    public String selectEmplName(Long compId, Long userId) {
        return baseDao.selectEmplNameByCompIdAndUserId(compId, userId);
    }

    @Override
    public int getActiveUser(Long compId) {
        return baseDao.getActiveUser(compId);
    }
}

